#include "Hal_Delay.h"
#include "stm32f10x.h"

static volatile uint32_t uwTick = 0;	//uwTick 是无符号32位整数,即使发生溢出，也会翻转然后继续计数 相当于 uwTick%2^32-1 运算


/*********************************************************************
* @brief  ：初始化滴答时钟源
*********************************************************************/
void HAL_InitTick(uint32_t HCLKFrq)
{
  SysTick->LOAD  = (uint32_t)((HCLKFrq*1000) - 1UL);  /* set reload register */
  SysTick->VAL   = 0UL;                                       /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_ENABLE_Msk;                   /* Enable the Systick Timer */
	
	/* Enable SysTick IRQ and SysTick Timer (用于hal_delay.c计时用) */
	SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
					 SysTick_CTRL_TICKINT_Msk |
                    SysTick_CTRL_ENABLE_Msk;    
}

/*********************************************************************
* @brief  ：复位滴答时钟源
*********************************************************************/
void HAL_DeInitTick(void)
{
	SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
}

/*********************************************************************
* @brief  ：滴答计数累加
*********************************************************************/
void HAL_IncTick(void)
{
	uwTick++;		//uwTick 是无符号32位整数,即使发生溢出，也会翻转然后继续计数 相当于 uwTick%2^32-1 运算
}

/*********************************************************************
* @brief  ：获取滴答计数
*********************************************************************/
uint32_t HAL_GetTick(void)
{
	return uwTick;
}

/*********************************************************************
* @brief  ：基于滴答的延时
*---------------------------------------------------------------------
* @param  ：volatile uint32_t Delay		,		延时ms数
*---------------------------------------------------------------------
* @retval ：none
*********************************************************************/
void HAL_Delay(volatile uint32_t Delay)
{
	uint32_t tickstart = 0;
	tickstart = HAL_GetTick();
	while((HAL_GetTick() - tickstart) < Delay)
	{
	}
}



/*********************************************************************
* @brief  ：滴答中断
*********************************************************************/
void SysTick_Handler(void)
{
	HAL_IncTick();
}
